#include "volumetool.h"
#include "ui_volumetool.h"
#include <QGraphicsDropShadowEffect>
#include <QPainter>
VolumeTool::VolumeTool(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::VolumeTool),
    isMuted(false),
    volumeRatio(20)
{
    ui->setupUi(this);
    //设置窗口标志为弹出式、无边框、无阴影
    setWindowFlags(Qt::Popup | Qt::FramelessWindowHint| Qt::NoDropShadowWindowHint);
    setAttribute(Qt::WA_TranslucentBackground);  // 关键：背景透明
    //自定义阴影效果：QGraphicsDropShadowEffect为图形化界面设置投影
    QGraphicsDropShadowEffect* shadowEffect = new QGraphicsDropShadowEffect(this);
    //设置阴影偏移量
    shadowEffect->setOffset(0, 0);
    //设置阴影颜色
    shadowEffect->setColor("#646464");
    //设置阴影模糊半径
    shadowEffect->setBlurRadius(10);
    setGraphicsEffect(shadowEffect);
    // 给按钮设置图标
    ui->silenceBtn->setIcon(QIcon(":/volumn.png"));

    //获取区域几何信息
    QRect rect = ui->outSlider->geometry();
    // 音量的默认大小是20（假设20表示20%）
    int volumePercentage = 20; // 20%
    int sliderHeight = 180; // 总高度
    int filledHeight = sliderHeight * volumePercentage / 100; // 计算填充高度

    // 设置outSlider的几何形状
    // 注意：y坐标应该从底部开始计算，因为音量是从下往上增长的
    ui->outSlider->setGeometry(rect.x(), 25 + (sliderHeight - filledHeight), rect.width(), filledHeight);

    // 移动滑块按钮到outSlider的顶部中间位置
    ui->sliderBtn->move(ui->sliderBtn->x(), ui->outSlider->y() - ui->sliderBtn->height()/2);

    // 设置显示文本
    ui->volumeRatio->setText(QString("%1%").arg(volumePercentage));
    connect(ui->silenceBtn, &QPushButton::clicked, this, &VolumeTool::onSilenceBtnClicked);

    // 为滑块区域安装事件过滤器
     ui->sliderBox->installEventFilter(this);
}
//当窗口需要重新绘制时自动调用，应为弹窗没办法随着主窗口移动而移动，所以我们每次移动主窗口时都要对音量弹窗进行重新绘制
void VolumeTool::paintEvent(QPaintEvent *event)
{
     (void)event;
    //1.创建绘图对象
    QPainter painter(this);

    //2.设置抗锯齿，使得图形更加平滑
    painter.setRenderHint(QPainter::Antialiasing,true);

    //3.设置画笔
    //设置边框画笔
    painter.setPen(Qt::NoPen);
    //设置画笔笔刷为白色
    painter.setBrush(Qt::white);
    //创建并且绘制三角形多边形（指向滑块区域的指示器）
    QPolygon polygon;
     polygon.append(QPoint(30, 300));//三角形左下角顶点
     polygon.append(QPoint(70, 300));//三角形右下角顶点
     polygon.append(QPoint(50, 320));//三角形底部中心顶点
     painter.drawPolygon(polygon);
}

bool VolumeTool::eventFilter(QObject *object, QEvent *event)
{
     if(object == ui->sliderBox)
     {
          if(event->type() == QEvent::MouseButtonPress)
          {
              //鼠标按下事件
               setVolume();
          }
          else if(event->type() == QEvent::MouseMove)
          {
              //鼠标释放事件
               setVolume();
               emit setMusicVolume(volumeRatio);
          }
          else if(event->type() == QEvent::MouseButtonRelease)
          {
              //鼠标移动事件
              emit setMusicVolume(volumeRatio);
          }
           return true;
     }
     return QObject::eventFilter(object, event);
}

void VolumeTool::setVolume()
{
    int height = ui->sliderBox->mapFromGlobal(QCursor().pos()).y();
    height = height < 25? 25 : height;
    height = height > 205? 205 : height;

    ui->sliderBtn->move(ui->sliderBtn->x(), height - ui->sliderBtn->height()/2);
    ui->outSlider->setGeometry(ui->outSlider->x(), height, ui->outSlider->width(), 205 - height);
    volumeRatio = (int)((int)ui->outSlider->height()/(float)180*100);
    ui->volumeRatio->setText(QString::number(volumeRatio)+"%");

}

VolumeTool::~VolumeTool()
{
    delete ui;
}
void VolumeTool::onSilenceBtnClicked()
{
    isMuted = !isMuted;
     if(isMuted)
     {
          ui->silenceBtn->setIcon(QIcon(":/silent.png"));
     }
     else
     {
          ui->silenceBtn->setIcon(QIcon(":/volumn.png"));
     }
      emit setSilence(isMuted);
}
